﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using DomainModel;
using Repository.Abstract;
using Services.Abstract;

namespace Services.Concrete
{
    public class SemesterService : Service<StudySemester>, ISemesterService
    {
        private readonly ISemesterRepository _semesterRepository;

        public SemesterService(ISemesterRepository semesterRepository, IPrincipal currentUser, IPermissionService permissionService)
            : base(semesterRepository, currentUser, permissionService)
        {
            _semesterRepository = semesterRepository;
        }

        #region ISemesterService Members

        public StudySemester GetCurrentSemester()
        {
            return _semesterRepository.GetSemesterByDate(DateTime.Now);
        }

        public List<StudySemester> GetSemestersByStudyYear(StudyYear studyYear)
        {
            if (studyYear == null)
            {
                throw new ArgumentNullException("studyYear");
            }

            return _semesterRepository.GetSemestersByStudyYear(studyYear).ToList();
        }

        public new void Delete(StudySemester semester)
        {
            if (!PermissionService.CanCUDSemesters())
                throw new Exception("Недостаточно прав для CUD операций с семестрами.");

            base.Delete(semester);
        }

        public new void SaveOrUpdate(StudySemester semester)
        {
            if (!PermissionService.CanCUDSemesters())
                throw new Exception("Недостаточно прав для CUD операций с семестрами.");

            if (semester == null)
            {
                throw new ArgumentNullException("semester");
            }

            if (semester.EndDate <= semester.BeginDate)
            {
                throw new Exception("Семестр не может закончиться раньше, чем начаться.");
            }

            if (semester.BeginDate < semester.StudyYear.BeginDate)
            {
                throw new Exception("Семестр не может начаться раньше учебного года.");
            }

            if (semester.EndDate > semester.StudyYear.EndDate)
            {
                throw new Exception("Семестр не может закончиться позже учебного года.");
            }

            StudySemester s = GetSemesterByDate(semester.BeginDate);

            if (s != null && s.Id != semester.Id)
            {
                throw new Exception("Новый семестр не может начинаться во время другого семестра.");
            }

            s = GetSemesterByDate(semester.EndDate);
            if (s != null && s.Id != semester.Id)
            {
                throw new Exception("Новый семестр не может начинаться во время другого семестра.");
            }

            base.SaveOrUpdate(semester);
        }

        public StudySemester GetSemesterByDate(DateTime date)
        {
            return _semesterRepository.GetSemesterByDate(date);
        }

        #endregion
    }
}